<?php
class MonitoreoController extends CustomController
{

    public function gruposActivos()
    {
        // Check if user is logged in
        $this->userLoggedIn();
        $this->isAdmin();
        // Vars
        $vars = array(
            'grupos' => $this->model->getGruposActivos(),
            'link_monitorear' => $this->link(MODULE_MONITOREO, MODULE_MONITOREO_MONITOREAR_GRUPO).'?id='
        );
        $this->view->gruposActivos($vars);
    }

    public function monitorearViaje()
    {
        // Check if user is logged in
        $this->userLoggedIn();
        $this->isAdmin();
        $idViaje = $this->getValue('id');
        if (!empty($idViaje) && ($viaje = $this->model->getViajeActivo($idViaje)))
        {
            // Ruta
            $mapaModel = new MapaModel();
            $ruta = $mapaModel->getRuta($viaje['fkruta']);
            // View
            $vars = array(
                'extra_class'       => 'monitoreo_individual',
                'rutas'             => array($viaje['fkruta'] => $ruta),
                'viajes'            => array($idViaje => $viaje),
                'geolocalizaciones' => $this->model->getGeolocalizaciones($idViaje),
                'server_time'       => time(),
                'individualViaje'   => $idViaje,
            );
            $this->view->monitoreo($vars);
        }
        else
        {
            $this->error('Viaje incorrecto');
            $this->redirectTo(MODULE_MONITOREO);
        }
    }

    public function monitorearGrupo()
    {
        // Check login
        $this->userLoggedIn(true);
        $this->isAdmin(true);
        // Check grupo
        $id = $this->getValue('id');
        if ($grupo = $this->model->getGrupoActivo($id))
        {
            $viajes = $this->model->getViajesActivosByGrupo($id);
            if (!empty($viajes))
            {
                // Generar una sesion con la informacion de este grupo (rutas + viajes) para actualizarla a medida que aparezcan nuevos datos en las geolocalizaciones
                $randSessionKeyGrupo = sha1(md5(microtime()).'foo'.$id).'_'.$this->user->getId();
                // Informacion de viajes
                $rutasIds     = array();
                $viajesIds    = array();
                $vehiculosIds = array();
                $oldestViaje  = 9999999999999999;
                foreach ($viajes as $viaje)
                {
                    $rutasIds[$viaje['fkruta']]         = $viaje['fkruta'];
                    $viajesIds[$viaje['idviaje']]       = $viaje['idviaje'];
                    $vehiculosIds[$viaje['fkvehiculo']] = $viaje['fkvehiculo'];
                }
                // View
                $vars = array(
                    'rutas'             => $this->model->getRutas($rutasIds),
                    'viajes'            => $viajes,
                    'geolocalizaciones' => $this->model->getGeolocazionesPorGrupo($viajesIds),
                    'grupo'             => $grupo[0],
                    'info_token'        => $randSessionKeyGrupo,
                    'server_time'       => time(),
                );
                if (!empty($vars['geolocalizaciones']))
                {
                    $lastGeoArr = end($vars['geolocalizaciones']);
                    $lastGeo    = $lastGeoArr['idgeolocalizacion'];
                }
                else
                {
                    $lastGeo = 0;
                }
                $this->model->setGrupoInfo($randSessionKeyGrupo, $grupo[0]['idgrupo'], $rutasIds, $viajesIds, $lastGeo);
                $this->view->monitoreo($vars);
            }
            // Esto no deberia pasar porque si levanta el grupo es porque tiene viajes, pero por las dudas lo dejamos
            else
            {
                $this->error('El grupo solicitado no es correcto');
                $this->redirectTo(MODULE_MONITOREO);
            }
        }
        else
        {
            $this->error('El grupo solicitado no es correcto');
            $this->redirectTo(MODULE_MONITOREO);
        }
    }

    public function geolocalizaciones()
    {
        // Check login
        $this->userLoggedIn(true);
        $this->isAdmin(true);
        // Get
        $idViaje = $this->getValue('fkviaje');
        $token   = $this->getValue('token');
        if (!empty($idViaje) || !empty($token))
        {
            if (!empty($token))
            {
                $grupoInfo = $this->model->getGrupoInfo($token);
                if (!empty($grupoInfo))
                {
                    $viajes = $this->model->getViajesActivosByGrupo($grupoInfo['idgrupo']);
                    if (!empty($viajes))
                    {
                        $auxViajes = array_merge(array_keys($viajes), array_keys($grupoInfo['viajes']));
                    }
                    else
                    {
                        $auxViajes = array_keys($grupoInfo['viajes']);
                    }
                    array_unique($auxViajes);
                    if ($geoLocalizaciones = $this->model->getGeolocazionesPorGrupo($auxViajes, $grupoInfo['last_check']))
                    {
                        $nuevasRutas  = array();
                        $nuevosViajes = array();
                        foreach ($geoLocalizaciones as $geoLoc)
                        {
                            if (!isset($grupoInfo['viajes'][$geoLoc['fkviaje']]))
                            {
                                $nuevosViajes[$geoLoc['fkviaje']] = $geoLoc['fkviaje'];
                                $grupoInfo['viajes'][$geoLoc['fkviaje']] = $geoLoc['fkviaje'];
                            }
                        }
                        if (!empty($nuevosViajes))
                        {
                            $nuevosViajes = $this->model->getViajesActivosByIds(array_keys($nuevosViajes));
                            if (!empty($nuevosViajes))
                            {
                                $nuevosViajesParsed = array();
                                foreach ($nuevosViajes as $viaje)
                                {
                                    $nuevosViajesParsed[] = $this->view->formatViaje($viaje);
                                    if (!isset($grupoInfo['rutas'][$viaje['fkruta']]))
                                    {
                                        $nuevasRutas[$viaje['fkruta']] = $viaje['fkruta'];
                                        $grupoInfo['rutas'][$viaje['fkruta']] = $viaje['fkruta'];
                                    }
                                }
                                $nuevosViajes = $nuevosViajesParsed;
                            }
                        }
                        if (!empty($nuevasRutas))
                        {
                            $nuevasRutas = $this->model->getRutas(array_keys($nuevasRutas));
                        }
                        if (!empty($geoLocalizaciones))
                        {
                            $lastGeoArr = end($geoLocalizaciones);
                            $lastGeo    = $lastGeoArr['idgeolocalizacion'];
                        }
                        else
                        {
                            $lastGeo = 0;
                        }
                        $this->model->setGrupoInfo($token, $grupoInfo['idgrupo'], $grupoInfo['rutas'], $grupoInfo['viajes'], $lastGeo);
                        // Return
                        $return = array(
                            'server_ts'         => time(),
                            'rutas'             => $nuevasRutas,
                            'viajes'            => $nuevosViajes,
                            'geolocalizaciones' => $geoLocalizaciones
                        );
                        $this->jSon($return);
                    }
                    else
                    {
                        $this->jSon(array('err' => 'none'));
                    }
                }
                else
                {
                    $this->jSon(array('err' => 'grupo'));
                }
            }
            else
            {
                $lastGeo = $this->getValue('lastGeoId');
                $geoLocalizaciones = $this->model->getGeolocalizaciones($idViaje, $lastGeo);
                // Return
                $return = array(
                    'server_ts'         => time(),
                    'geolocalizaciones' => $geoLocalizaciones
                );
                $this->jSon($return);
            }
        }
        else
        {
            $this->jSon(array('err' => 1));
        }
    }

}
?>